1   /*                        __    __  __  __    __  ___
2    *                       \  \  /  /    \  \  /  /  __/
3    *                        \  \/  /  /\  \  \/  /  /
4    *                         \____/__/  \__\____/__/.ɪᴏ
5    * ᶜᵒᵖʸʳᶦᵍʰᵗ ᵇʸ ᵛᵃᵛʳ ⁻ ˡᶦᶜᵉⁿˢᵉᵈ ᵘⁿᵈᵉʳ ᵗʰᵉ ᵃᵖᵃᶜʰᵉ ˡᶦᶜᵉⁿˢᵉ ᵛᵉʳˢᶦᵒⁿ ᵗʷᵒ ᵈᵒᵗ ᶻᵉʳᵒ
6    */
7   package io.vavr.collection;
8   
9   import io.vavr.Function1;
10  import io.vavr.PartialFunction;
11  import io.vavr.Tuple3;
12  import io.vavr.Tuple2;
13  import io.vavr.control.Option;
14  
15  import java.io.Serializable;
16  import java.util.Comparator;
17  import java.util.function.*;
18  
19  /**
20   * An immutable {@code Set} interface.
21   * <p>
22   * CAUTION: The Vavr {@code Set} implementations generally support {@code null} elements. However {@code SortedSet}
23   * implementations require an element {@code Comparator}, which may not support {@code null} elements.
24   * <p>
25   * Examples:
26   *
27   * <pre>{@code Set<?> addNull(Set<?> set) {
28   *
29   *     // CAUTION: Do not expect a Set to accept null values in general!
30   *     return set.add(null);
31   *
32   * }
33   *
34   * void test() {
35   *
36   *     // ok
37   *     addNull(HashSet.of(1));
38   *
39   *     // ok
40   *     addNull(TreeSet.of(nullsFirst(naturalOrder()), 1));
41   *
42   *     // ok
43   *     addNull(TreeSet.empty());
44   *
45   *     // throws NPE!
46   *     addNull(TreeSet.of(1));
47   *
48   * }}</pre>
49   *
50   * <p>
51   * Basic operations:
52   *
53   * <ul>
54   * <li>{@link #add(Object)}</li>
55   * <li>{@link #addAll(Iterable)}</li>
56   * <li>{@link #diff(Set)}</li>
57   * <li>{@link #intersect(Set)}</li>
58   * <li>{@link #remove(Object)}</li>
59   * <li>{@link #removeAll(Iterable)}</li>
60   * <li>{@link #union(Set)}</li>
61   * </ul>
62   *
63   * Conversion:
64   *
65   * <ul>
66   * <li>{@link #toJavaSet()}</li>
67   * </ul>
68   *
69   * @param <T> Component type
70   * @author Daniel Dietrich, Ruslan Sennov
71   */
72  public interface Set<T> extends Traversable<T>, Function1<T, Boolean>, Serializable {
73  
74      long serialVersionUID = 1L;
75  
76      /**
77       * Narrows a widened {@code Set<? extends T>} to {@code Set<T>}
78       * by performing a type-safe cast. This is eligible because immutable/read-only
79       * collections are covariant.
80       *
81       * @param set A {@code Set}.
82       * @param <T> Component type of the {@code Set}.
83       * @return the given {@code set} instance as narrowed type {@code Set<T>}.
84       */
85      @SuppressWarnings("unchecked")
86      static <T> Set<T> narrow(Set<? extends T> set) {
87          return (Set<T>) set;
88      }
89  
90      /**
91       * Add the given element to this set, if it is not already contained.
92       *
93       * @param element The element to be added.
94       * @return A new set containing all elements of this set and also {@code element}.
95       */
96      Set<T> add(T element);
97  
98      /**
99       * Adds all of the given elements to this set, if not already contained.
100      *
101      * @param elements The elements to be added.
102      * @return A new set containing all elements of this set and the given {@code elements}, if not already contained.
103      */
104     Set<T> addAll(Iterable<? extends T> elements);
105 
106     /**
107      * Tests if a given {@code element} is contained in this {@code Set}.
108      * <p>
109      * This method is equivalent to {@link #contains(Object)}.
110      *
111      * @param element the element to test for membership.
112      * @return {@code true} if the given {@code element} is contained, {@code false} otherwise.
113      */
114     @Override
115     default Boolean apply(T element) {
116         return contains(element);
117     }
118 
119     /**
120      * Calculates the difference between this set and another set.
121      * <p>
122      * See also {@link #removeAll(Iterable)}.
123      *
124      * @param that Elements to be removed from this set.
125      * @return A new Set containing all elements of this set which are not located in {@code that} set.
126      */
127     Set<T> diff(Set<? extends T> that);
128 
129     /**
130      * Computes the intersection between this set and another set.
131      * <p>
132      * See also {@link #retainAll(Iterable)}.
133      *
134      * @param that the set to intersect with.
135      * @return A new Set consisting of all elements that are both in this set and in the given set {@code that}.
136      */
137     Set<T> intersect(Set<? extends T> that);
138 
139     /**
140      * Removes a specific element from this set, if present.
141      *
142      * @param element The element to be removed from this set.
143      * @return A new set consisting of the elements of this set, without the given {@code element}.
144      */
145     Set<T> remove(T element);
146 
147     /**
148      * Removes all of the given elements from this set, if present.
149      *
150      * @param elements The elements to be removed from this set.
151      * @return A new set consisting of the elements of this set, without the given {@code elements}.
152      */
153     Set<T> removeAll(Iterable<? extends T> elements);
154 
155     /**
156      * Converts this Vavr {@code Set} to a {@code java.util.Set} while preserving characteristics
157      * like insertion order ({@code LinkedHashSet}) and sort order ({@code SortedSet}).
158      *
159      * @return a new {@code java.util.Set} instance
160      */
161     @Override
162     java.util.Set<T> toJavaSet();
163 
164     /**
165      * Adds all of the elements of {@code that} set to this set, if not already present.
166      * <p>
167      * See also {@link #addAll(Iterable)}.
168      *
169      * @param that The set to form the union with.
170      * @return A new set that contains all distinct elements of this and {@code that} set.
171      */
172     Set<T> union(Set<? extends T> that);
173 
174     // -- Adjusted return types of Traversable methods
175 
176     @Override
177     <R> Set<R> collect(PartialFunction<? super T, ? extends R> partialFunction);
178 
179     @Override
180     boolean contains(T element);
181 
182     @Override
183     Set<T> distinct();
184 
185     @Override
186     Set<T> distinctBy(Comparator<? super T> comparator);
187 
188     @Override
189     <U> Set<T> distinctBy(Function<? super T, ? extends U> keyExtractor);
190 
191     @Override
192     Set<T> drop(int n);
193 
194     @Override
195     Set<T> dropRight(int n);
196 
197     @Override
198     Set<T> dropUntil(Predicate<? super T> predicate);
199 
200     @Override
201     Set<T> dropWhile(Predicate<? super T> predicate);
202 
203     @Override
204     Set<T> filter(Predicate<? super T> predicate);
205 
206     @Override
207     <U> Set<U> flatMap(Function<? super T, ? extends Iterable<? extends U>> mapper);
208 
209     @Override
210     <C> Map<C, ? extends Set<T>> groupBy(Function<? super T, ? extends C> classifier);
211 
212     @Override
213     Iterator<? extends Set<T>> grouped(int size);
214 
215     @Override
216     Set<T> init();
217 
218     @Override
219     Option<? extends Set<T>> initOption();
220 
221     @Override
222     default boolean isDistinct() {
223         return true;
224     }
225 
226     @Override
227     Iterator<T> iterator();
228 
229     @Override
230     int length();
231 
232     @Override
233     <U> Set<U> map(Function<? super T, ? extends U> mapper);
234 
235     @Override
236     Set<T> orElse(Iterable<? extends T> other);
237 
238     @Override
239     Set<T> orElse(Supplier<? extends Iterable<? extends T>> supplier);
240 
241     @Override
242     Tuple2<? extends Set<T>, ? extends Set<T>> partition(Predicate<? super T> predicate);
243 
244     @Override
245     Set<T> peek(Consumer<? super T> action);
246 
247     @Override
248     Set<T> replace(T currentElement, T newElement);
249 
250     @Override
251     Set<T> replaceAll(T currentElement, T newElement);
252 
253     @Override
254     Set<T> retainAll(Iterable<? extends T> elements);
255 
256     @Override
257     Set<T> scan(T zero, BiFunction<? super T, ? super T, ? extends T> operation);
258 
259     @Override
260     <U> Set<U> scanLeft(U zero, BiFunction<? super U, ? super T, ? extends U> operation);
261 
262     @Override
263     <U> Set<U> scanRight(U zero, BiFunction<? super T, ? super U, ? extends U> operation);
264 
265     @Override
266     Iterator<? extends Set<T>> slideBy(Function<? super T, ?> classifier);
267 
268     @Override
269     Iterator<? extends Set<T>> sliding(int size);
270 
271     @Override
272     Iterator<? extends Set<T>> sliding(int size, int step);
273 
274     @Override
275     Tuple2<? extends Set<T>, ? extends Set<T>> span(Predicate<? super T> predicate);
276 
277     @Override
278     Set<T> tail();
279 
280     @Override
281     Option<? extends Set<T>> tailOption();
282 
283     @Override
284     Set<T> take(int n);
285 
286     @Override
287     Set<T> takeRight(int n);
288 
289     @Override
290     Set<T> takeUntil(Predicate<? super T> predicate);
291 
292     @Override
293     Set<T> takeWhile(Predicate<? super T> predicate);
294 
295     @Override
296     <T1, T2> Tuple2<? extends Set<T1>, ? extends Set<T2>> unzip(Function<? super T, Tuple2<? extends T1, ? extends T2>> unzipper);
297 
298     @Override
299     <T1, T2, T3> Tuple3<? extends Set<T1>, ? extends Set<T2>, ? extends Set<T3>> unzip3(Function<? super T, Tuple3<? extends T1, ? extends T2, ? extends T3>> unzipper);
300 
301     @Override
302     <U> Set<Tuple2<T, U>> zip(Iterable<? extends U> that);
303 
304     @Override
305     <U, R> Set<R> zipWith(Iterable<? extends U> that, BiFunction<? super T, ? super U, ? extends R> mapper);
306 
307     @Override
308     <U> Set<Tuple2<T, U>> zipAll(Iterable<? extends U> that, T thisElem, U thatElem);
309 
310     @Override
311     Set<Tuple2<T, Integer>> zipWithIndex();
312 
313     @Override
314     <U> Set<U> zipWithIndex(BiFunction<? super T, ? super Integer, ? extends U> mapper);
315 }